package godzilla.ciudad.recursos;

import godzilla.ciudad.estructuras.Estructura;

import java.util.Iterator;
import java.util.LinkedList;

public abstract class Recurso {

	protected int cantidad;
	protected LinkedList<Estructura> listaDeEstructurasUtilizandome;
	
	public abstract String nombre();
	
	public int cantidad(){
		return this.cantidad;
	}
	
	public abstract int cantidadMaxima();
	
	public Recurso(int cantidad) {
		this.cantidad = cantidad;
		listaDeEstructurasUtilizandome = new LinkedList<Estructura>();
	}
	
	public Recurso() {
		this.cantidad = this.cantidadMaxima();
		listaDeEstructurasUtilizandome = new LinkedList<Estructura>();
	}
	
	public boolean seraUtilizadoPor(Estructura estructura){
		
		if (puedeSerUtilizadoPor(estructura)){
			listaDeEstructurasUtilizandome.add(estructura);
			return true;
		}
		
		return false;

		
	}
	
	public boolean esUtilizadoPor(Estructura estructura) {
		
		return listaDeEstructurasUtilizandome.contains(estructura);
		
	}

	public boolean esEquivalenteA(Recurso recursoBuscado) {

		return (this.nombre() == recursoBuscado.nombre());
	}
	
	public void propagar(Estructura estructura) {

		if (estructura.permitePropagar(this)) estructura.listaDeRecursosQuePermiteAcceder().agregar(this);
		
	}

	public boolean puedeSerUtilizadoPor(Estructura estructura) {

		Recurso necesidad = estructura.necesidades().extraerRecurso(this);
		if (this.cantidadDisponible() >= necesidad.cantidad()) return true;
		return false;
	}

	private int cantidadDisponible() {
		Iterator<Estructura> iterador = this.listaDeEstructurasUtilizandome.iterator();
		int totalUtilizado=0;
		
		while (iterador.hasNext()){
			Recurso recursoASumar = iterador.next().necesidades().extraerRecurso(this);
			totalUtilizado = totalUtilizado + recursoASumar.cantidad();
		}
		return (this.cantidad() - totalUtilizado);
		
	}

	public void liberarEstructurasUsandome() {
		
		while(!this.listaDeEstructurasUtilizandome.isEmpty()){
			this.listaDeEstructurasUtilizandome.removeFirst();
		}

		
	}
	
}
